package org.bopis.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.bopis.form.ResetPasswordForm;
import org.bopis.general.Constantes;
import org.bopis.services.db.DAOUsuario;
import org.bopis.services.mail.MailSender;
import org.bopis.utilidades.Utilidades;

import com.boole.model.Usuario;

/**
 * Action que recibe la peticion de reseteo de password.
 * Recibe los parametros de acceso a reseteo de password y redirecciona al usuario a dicha pagina.
 * @author i-fernandezmolina
 *
 */
public class ResetPasswordAction extends CustomBaseAction {

	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		//variables
		String codigoActivacionUsuario = null;
		String passwordUsuarioMD5 = null;
		Usuario usuario = null;
		String from = null;
				
		if(form != null)
			from = ((ResetPasswordForm) form).getFrom();
		
		if(Utilidades.isVacia(from)){
		
			//nos llega la solicitud para redireccionar a cambio de password
			//cogemos los parametros de la request
			codigoActivacionUsuario = request.getParameter("c");
			passwordUsuarioMD5 = request.getParameter("p");
			
			if(Utilidades.isVacia(codigoActivacionUsuario) || Utilidades.isVacia(passwordUsuarioMD5)){
				addActionError(request, "campos", "forgot.pass.error.codigo");
			}
			
			//buscamos al usuario que tenga la el codigo de activacion y la password que nos han llegado por la request
			usuario = DAOUsuario.getUsuarioByCodActivacionAndPass(codigoActivacionUsuario, passwordUsuarioMD5);
			
			if(usuario == null){
				addActionError(request, "error", "forgot.pass.error.codigo");
				return mapping.findForward("Failure");
			}				
			
			//si se han obtenido datos, se almacenan en sesion
			addObjectToSession(request, "userResetPassword", usuario);
			
			//cambiamos el codigo de activacion
			if(!DAOUsuario.resetCodigoActivacion(usuario.getEmail())){
				addActionError(request, "error", "forgot.pass.error");
				return mapping.findForward("Failure");
			}
			
		}else{
			
			//nos llega la nueva password de usuario
			
			//obtenemos al usuario de la sesion
			usuario = (Usuario) getSessionObject(request, "userResetPassword");
			
			//actualizamos la password
			if(!DAOUsuario.updatePasswordUsuario(usuario.getEmail(), ((ResetPasswordForm) form).getPass1())){
				addActionError(request, "error", "forgot.pass.error");
			}
			
			//enviamos al usuario una notificacion de que se ha cambiado la password
			MailSender mailSender = new MailSender();
			String asunto =  Constantes.EMAIL_ASUNTO_PASSWORD_RESETED;
			String mensaje = Constantes.EMAIL_MENSAJE_PASSWORD_RESETED;
			mensaje = mensaje.replaceAll("email", usuario.getEmail());
			mensaje = mensaje.replaceAll("pass", ((ResetPasswordForm) form).getPass1());
			mensaje = mensaje.replaceAll("protocol", Constantes.APP_PROTOCOL);
			mensaje = mensaje.replaceAll("nameapp", Constantes.APP_NAME);
			if(Utilidades.isVacia(Constantes.APP_PORT))
				mensaje = mensaje.replaceAll("host", Constantes.APP_HOST);
			else
				mensaje = mensaje.replaceAll("host", Constantes.APP_HOST + ":" + Constantes.APP_PORT);
			
			mailSender.sendEmail(usuario.getEmail(), usuario.getScreenname(), asunto, mensaje);
			
			//borramos al usuario de la sesion
			request.getSession().removeAttribute("userResetPassword");
			
			addActionMessage(request, "forgot.pass.sent");
			
		}
				
		
		
    	return mapping.findForward("Success");

	}
	
}
